/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.disco.gco.ngc;

import com.jjsoft.disco.gco.dao.GenericController;
import com.jjsoft.disco.gco.mdl.DetalleCompra;
import com.jjsoft.disco.gco.mdl.FacturaCompra;
import com.jjsoft.disco.gco.mdl.Producto;
import com.jjsoft.disco.gco.mdl.Proveedor;
import com.jjsoft.disco.gco.mdl.Proveedorproducto;
import com.jjsoft.disco.gco.util.FacturaYaVendidaException;
import com.jjsoft.disco.gco.util.ProductoValidadorException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author javila
 */
public class FacturaCompraManager {

    GenericController<FacturaCompra> controladorFactura = new GenericController<FacturaCompra>();
    ProductoManager am = new ProductoManager();
    ProveedorManager pm = new ProveedorManager();
    GenericController<Producto> controladorArticulo = new GenericController<Producto>();

    public void guardarFactura(FacturaCompra factura) {
        for (DetalleCompra detalle : factura.getDetalleCompraList()) {
            detalle.setIdFactura(factura);
            if (detalle.getIdProducto().getModo() == 0) {
                RegistraArticuloNuevo(detalle);
            } else if (detalle.getIdProducto().getModo() == 1) {
                ModificaArticulo(detalle);
            }
            am.aumentarStock(detalle.getIdProducto(), detalle.getCantidad());
            registraProveedor(detalle);

        }
        controladorFactura.create(factura);
    }

    public void ModificaArticulo(DetalleCompra detalle) {
        try {
            controladorArticulo.edit(detalle.getIdProducto());
        } catch (Exception ex) {
            Logger.getLogger(FacturaCompraManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void RegistraArticuloNuevo(DetalleCompra detalle) {
        if (am.buscarPorCodigo(detalle.getIdProducto().getCodigo()) == null) { //se registra nuevoArticulo
            List<Proveedor> proveedor = new ArrayList<Proveedor>();
            proveedor.add(detalle.getIdFactura().getIdProveedor());
            
            try {
                am.crearProducto(detalle.getIdProducto(), proveedor);
            } catch (ProductoValidadorException ex) {
                Logger.getLogger(FacturaCompraManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
           
   
    }

    public void registraProveedor(DetalleCompra detalle) {
        detalle.getIdProducto().setProveedorproductoList(am.buscaProveedores(detalle.getIdProducto()));
        boolean existe = false;
        for (Proveedorproducto prov : detalle.getIdProducto().getProveedorproductoList()) {
            if (detalle.getIdFactura().getIdProveedor().equals(prov.getIdProveedor())) {
                existe = true;
                break;
            }
        }
        if (!existe) {
            GenericController<Proveedorproducto> controladorProvArt = new GenericController<Proveedorproducto>();
            Proveedorproducto provArt = new Proveedorproducto();
            provArt.setIdProducto(detalle.getIdProducto());
            provArt.setIdProveedor(detalle.getIdFactura().getIdProveedor());
            controladorProvArt.create(provArt);
        }
    }

    public FacturaCompra buscarPorNumero(int numero, Proveedor proveedor) {
        try {
            FacturaCompra factura = controladorFactura.findWhere(new FacturaCompra(), "numFactura=" + numero + " and idProveedor=" + proveedor.getIdProveedor()).get(0);
            GenericController<DetalleCompra> cdt = new GenericController<DetalleCompra>();
            List<DetalleCompra> listadetalle = cdt.findWhere(new DetalleCompra(), "idFactura=" + factura.getIdFactura());
            factura.setDetalleCompraList(listadetalle);
            return factura;
        } catch (Exception ex) {
            return null;
        }
    }

    public List<FacturaCompra> buscarPorProveedor(Proveedor proveedor) {
        try {
            List<FacturaCompra> facturas = controladorFactura.findWhere(new FacturaCompra(), "idProveedor=" + proveedor.getIdProveedor());
            return facturas;
        } catch (Exception ex) {
            return null;
        }
    }

    public List<FacturaCompra> buscarPorFechas(Date fecha1, Date fecha2) {
        String fechaIni = (fecha1.getYear() + 1900) + "-" + (fecha1.getMonth() + 1) + "-" + fecha1.getDate() + " 00:00:00";
        String fechafin = (fecha2.getYear() + 1900) + "-" + (fecha2.getMonth() + 1) + "-" + fecha2.getDate() + " 23:59:59";
        return controladorFactura.findWhere(new FacturaCompra(), "fecha_emision>='" + fechaIni + "' and fecha_emision<='" + fechafin + "'");
    }
    public List<DetalleCompra> buscarDetalle(FacturaCompra factura) {
        GenericController<DetalleCompra> controladorDetalle = new GenericController<DetalleCompra>();
        return controladorDetalle.findWhere(new DetalleCompra(), "idFactura=" + factura.getIdFactura());
    }

    public void anularFactura(FacturaCompra factura) throws FacturaYaVendidaException {
        factura.setEstado(1);
        try {
            controladorFactura.edit(factura);
            for (int i = 0; i < factura.getDetalleCompraList().size(); i++) {
                am.reducirStock(factura.getDetalleCompraList().get(i).getIdProducto(), factura.getDetalleCompraList().get(i).getCantidad());
            }
        } catch (Exception ex) {
            Logger.getLogger(FacturaCompraManager.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
